// 封装集合的构造函数
function Set() {
  // 使用一个对象来保存集合的元素
  this.items = {};

  // 集合的操作方法
  // 判断集合中是否有某个元素
  this.has = function (value) {
    return this.items.hasOwnProperty(value);
  };

  // 向集合中添加元素
  this.add = function (value) {
    // 1.判断集合中是否已经包含了该元素
    if (this.has(value)) return false;

    // 2.将元素添加到集合中
    this.items[value] = value;
    return true;
  };

  // 从集合中删除某个元素
  this.remove = function (value) {
    // 1.判断集合中是否包含该元素
    if (!this.has(value)) return false;

    // 2.包含该元素, 那么将元素删除
    delete this.items[value];
    return true;
  };

  // 清空集合中所有的元素
  this.clear = function () {
    this.items = {};
  };

  // 获取集合的大小
  this.size = function () {
    return Object.keys(this.items).length;

    /*
        考虑兼容性问题, 使用下面的代码
        var count = 0
        for (var value in this.items) {
            if (this.items.hasOwnProperty(value)) {
                count++
            }
        }
        return count
        */
  };

  // 获取集合中所有的值
  this.values = function () {
    return Object.keys(this.items);

    /*
        考虑兼容性问题, 使用下面的代码
        var keys = []
        for (var value in this.items) {
            keys.push(value)
        }
        return keys
        */
  };
}

// // 创建集合实例
// let demo = new Set();
// // 向集合添加元素
// demo.add(1);
// demo.add(2);
// demo.add(3);
// demo.add(4);
// demo.add(5);
// demo.add(6);
// demo.add(7);
// demo.add(8);
// // 获取集合中所有的值
// console.log("获取集合中所有的值 -", demo.values());
// // 获取集合的大小
// console.log("获取集合的大小 -", demo.size());
// // 判断集合中是否有某个元素
// console.log("判断集合中是否有3这个元素 -", demo.has(3));
// // 从集合中删除某个元素
// console.log("从集合中删除6这个元素 -", demo.remove(6));
// // 获取集合中所有的值
// console.log("获取集合中所有的值 -", demo.values());
// // 清空集合中所有的元素
// console.log("清空集合中所有的元素 -", demo.clear());
// // 获取集合中所有的值
// console.log("清空后所有元素 -", demo.values());

// -------------------------------------------------
// -------------------------------------------------
// ---------------ES6 Class写法---------------------
// -------------------------------------------------
// -------------------------------------------------
class SetClass {
  constructor() {
    // 使用一个对象来保存集合的元素
    this.items = {};
  }
  // 集合的操作方法
  // 判断集合中是否有某个元素
  has(value) {
    // hasOwnProperty方法 - 对象是否有对应名称的属性
    return this.items.hasOwnProperty(value);
  }
  // 向集合中添加元素
  add(value) {
    // 1.判断集合中是否已经包含了该元素
    if (this.has(value)) {
      return false;
    }
    // 2.将元素添加到集合中
    this.items[value] = value;
    return true;
  }
  // 从集合中删除某个元素
  remove(value) {
    // 1.判断集合中是否包含该元素
    if (!this.has(value)) return false;

    // 2.包含该元素, 那么将元素删除
    delete this.items[value];
    return true;
  }
  // 清空集合中所有的元素
  clear() {
    this.items = {};
  }
  // 获取集合的大小
  size() {
    // Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组
    return Object.keys(this.items).length;
    /*
        考虑兼容性问题, 使用下面的代码
        var count = 0
        for (var value in this.items) {
            if (this.items.hasOwnProperty(value)) {
                count++
            }
        }
        return count
        */
  }
  values() {
    return Object.keys(this.items);
    /*
        考虑兼容性问题, 使用下面的代码
        var keys = []
        for (var value in this.items) {
            keys.push(value)
        }
        return keys
        */
  }
}

let ins = new SetClass();
ins.add(1);
ins.add(2);
ins.add(3);
ins.add(99999);
console.log("集合实例 -", ins);
console.log("集合长度 -", ins.size());
console.log("集合中是否有99999 -", ins.has(99999));
ins.remove(99999);
console.log("集合中删除99999之后 -", ins);
console.log("获取集合中的值 -", ins.values());
ins.clear();
console.log("集合清空之后 -", ins);
